// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef DEVICE_BASE_DEVICE_MONITOR_WIN_H_
#define DEVICE_BASE_DEVICE_MONITOR_WIN_H_

#include <windows.h>

#include "base/observer_list.h"
#include "device/base/device_base_export.h"

namespace device {

// Use an instance of this class to observe devices being added and removed
// from the system, matched by device interface GUID.
class DEVICE_BASE_EXPORT DeviceMonitorWin {
public:
    class DEVICE_BASE_EXPORT Observer {
    public:
        virtual void OnDeviceAdded(const GUID& class_guid,
            const std::string& device_path);
        virtual void OnDeviceRemoved(const GUID& class_guid,
            const std::string& device_path);
    };

    ~DeviceMonitorWin();

    static DeviceMonitorWin* GetForDeviceInterface(const GUID& guid);
    static DeviceMonitorWin* GetForAllInterfaces();

    void AddObserver(Observer* observer);
    void RemoveObserver(Observer* observer);

private:
    friend class DeviceMonitorMessageWindow;

    DeviceMonitorWin();

    void NotifyDeviceAdded(const GUID& class_guid,
        const std::string& device_path);
    void NotifyDeviceRemoved(const GUID& class_guid,
        const std::string& device_path);

    base::ObserverList<Observer> observer_list_;
};

} // namespace device

#endif // DEVICE_BASE_DEVICE_MONITOR_WIN_H_
